/***
 * @Description: 本文件是关于ICMP协议的头文件，主要包括其数据结构的定义，ping功能的实现，不可达差错功能的实现
 * @Author: Liverpool
 * @Date: 2024-07-13 19:31:36
 * @LastEditTime: 2024-07-13 19:37:32
 * @LastEditors: Liverpool
 */

#ifndef ICMPV4_H
#define ICMPV4_H

#include "netComman.h"
#include "ipaddr.h"
#include "net_Interface.h"
#include "packet.h"

// 定义ICMP协议的相关类型
typedef enum _icmp_type
{
    ICMPv4_ECHO_REQUEST = 8,
    ICMPv4_ECHO_REPLY = 0,
    ICMPv4_UNREACH = 3,
} D_ICMPv4_Type;
// 定义ICMP协议的相关代码
typedef enum _icmp_code
{
    ICMPv4_ECHO = 0,
    ICMPv4_UNREACH_PORT = 3, // 端口不可达
} D_ICMPv4_Code;

// 定义ICMPv4协议的数据结构
#pragma pack(1)
// 定义ICMPv4协议数据的包头部分
typedef struct _icmpv4_header
{
    uint8_t type;      // 类型
    uint8_t code;      // 代码
    uint16_t checksum; // 整个数据包的校验和
} D_ICMPv4_Header;
// 定义ICMPv4协议数据包的整体结构
typedef struct _icmpv4_packet
{
    D_ICMPv4_Header header;
    union
    {
        uint32_t reserve; // 预留位置
    };
    uint8_t data[1]; // 数据区，只需要保存数据包的内存位置就行了
} D_ICMPv4_Packet;

#pragma pack()

net_err_t icmpv4_init(void);                                                                // ICMP协议的模块初始化
net_err_t icmpv4_in(D_IP_ADDR *src_ip, D_IP_ADDR *netif_ip, D_Packet *buf);                 // 对ICMP协议的输入数据进行解析处理
net_err_t icmpv4_out_unreach(D_IP_ADDR *dest, D_IP_ADDR *src, uint8_t code, D_Packet *buf); // ICMP协议发送不可达

#endif // !